package cn.zz.veggie.persistence.repository;

import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;

import org.springframework.stereotype.Repository;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.zz.comm.core.types.query.PageQuery;
import cn.zz.comm.exception.classes.FatalErrorException;
import cn.zz.comm.util.CollectorUtil;
import cn.zz.veggie.model.domain.PurchaseItem;
import cn.zz.veggie.model.query.PurchaseItemQuery;
import cn.zz.veggie.persistence.dao.PurchaseItemDao;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

/**
 * 采购明细表(PurchaseItem)repo
 *
 * @author zhongq
 * @since 2024-06-03 23:40:02
 */
@Slf4j
@Repository
@RequiredArgsConstructor
public class PurchaseItemRepository {

	private final PurchaseItemDao purchaseItemDao;

	public PurchaseItem findById(Integer id) {
		Objects.requireNonNull(id);
		final PurchaseItemQuery query = new PurchaseItemQuery();
		query.setId(id);
		return purchaseItemDao.selectOne(query);
	}

	public Map<Integer, PurchaseItem> findByIds(Collection<Integer> ids) {
		if (CollectionUtil.isEmpty(ids)) {
			return Collections.emptyMap();
		}
		final PurchaseItemQuery query = new PurchaseItemQuery();
		query.setIds(ids);
		query.page(PageQuery.size(ids.size()));
		final List<PurchaseItem> records = purchaseItemDao.select(query);
		return CollectorUtil.btmByKeyFun(records, PurchaseItem::getId);
	}

	public List<PurchaseItem> findByPage(PurchaseItemQuery query, PageQuery page) {
		page.setTotal(purchaseItemDao.selectCount(query));
		if (page.hasMoreItems()) {
			return purchaseItemDao.select(query);
		}
		return Collections.emptyList();
	}

	public void save(PurchaseItem purchaseItem) {
		Objects.requireNonNull(purchaseItem);
		if (purchaseItem.getId() == null) {
			// insert
			final int effect = purchaseItemDao.insert(purchaseItem);
			if (effect != 1) {
				throw new FatalErrorException("created purchaseItem fail ");
			}
			log.info("created purchaseItem for {}", purchaseItem.getId());
		} else {
			// update
			final int effect = purchaseItemDao.updateById(purchaseItem);
			if (effect != 1) {
				throw new FatalErrorException("update purchaseItem fail ");
			}
			log.info("updated purchaseItem for {}", purchaseItem.getId());
		}
	}

	public void deleteById(Integer id) {
		Objects.requireNonNull(id);
		final int effect = purchaseItemDao.deleteById(id);
		if (effect != 1) {
			log.error("delete");
			throw new FatalErrorException("delete purchaseItem fail ");
		}
		log.info("delete purchaseItem for {}", id);
	}

	public void deleteByIds(Collection<Integer> ids) {
		if (CollUtil.isEmpty(ids)) {
			return;
		}
		final int effect = purchaseItemDao.deleteByIds(ids);
		log.info("delete purchaseItem for {}", effect);
	}

	public void batchSave(List<PurchaseItem> purchaseItems) {
		if (CollUtil.isEmpty(purchaseItems)) {
			return;
		}
		// update
		// insert
		// delete

		final int effect = purchaseItemDao.insertBatch(purchaseItems);
		log.info("batch insert purchaseItem for {}", effect);
	}

	public Map<Integer, PurchaseItem> findByStatTime(Long statTime) {
		Objects.requireNonNull(statTime);
		final PurchaseItemQuery query = new PurchaseItemQuery();
		query.setStatTime(statTime);
		query.size = PageQuery.SIZE_HUGE;
		final List<PurchaseItem> items = purchaseItemDao.select(query);
		return CollectorUtil.btmByKeyFun(items, PurchaseItem::getProductId);
	}

}